<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>函数</title>
</head>
<body>
<script>
    // 1.通过function关键字定义函数
    // 1.1
    function f1 () {
        console.log('f1方法体测试文段_');
    }
    f1();// 调用函数 调用几次执行几次
    f1();
    f1();
    // 1.2
    function f2 (n) {// 函数形参不需要指定类型 指定形参名即可
        console.log('f2方法体测试文段_'+n);
    }
    f2(1);
    f2(2.2);
    f2('叁叁');
    f2(false);
    // 1.3
    function f3 (a,b) {
        console.log(a+b);
    }
    f3(1,2);
    // 形参个数>实参个数 未被赋值的形参值为 `undefined`
    f3(1);// 1 + undefined = NaN
    // 形参个数<实参个数 多余的实参会被忽略
    f3(1,2,12);// 1 + 2 = 3
    // 1.4
    // arguments 用来保存调用函数时传入的实参 可以观看到实参的个数和对应的值
    function f4 () {
        console.log(arguments);
    }
    f4();// Arguments[callee: ƒ, Symbol(Symbol.iterator): ƒ]
    f4(10);// Arguments(1)[10, callee: ƒ, Symbol(Symbol.iterator): ƒ]
    f4(10,20);// Arguments(2)[10,20 callee: ƒ, Symbol(Symbol.iterator): ƒ]
    f4(10,20,30);// Arguments(3)[10,20,30 callee: ƒ, Symbol(Symbol.iterator): ƒ]

    // 1.5
    // 使用return关键字返回方法的结果
    function f5 (a, b) {
        return a + b;
    }
    console.log(f5(1,2));// 直接打印return的结果
    let res = f5(4,5);// 将打印的结果保存在定义的变量(res)中并打印
    console.log(res);


    // 2.匿名函数表达式
    let f6 = function () {
        console.log('第二大类函数声明方式');
    }
    f6();
    // 此时f6变量的类型为 `function` 函数类型
    console.log(typeof f6);// function
    console.log(f6);// f (){console.log('第二大类函数声明方式');}


    // 3.箭头函数
    const f7 = (n)=>{
        console.log('第三大类函数声明方式_'+n);
    }
    f7(33);


    // 4.Function构造函数
    // new Function(参数1 ,参数2 ,... ,方法体)
    // 最后一个参数为字符串类型的方法体 若在方法体中会出现引号 则使用双引号包含单引号的编写格式
    let f8 = new Function('name','age',"console.log('方法体:'+name);return age;");
    console.log(f8('张三,18'));
</script>
</body>
</html>